﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.Interfaces.Repositorios;
using LM.Negocio.Objetos;

namespace LM.Negocio.Validadores
{
    public class ValidadorDeOperador : ValidadorAbastrato
    {
         private Operador _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<Operador> _repositorioDeOperador;

        public ValidadorDeOperador( IRepositorioDeConsultaDeObjetos<Operador> repositorioDeOperador)
        {
            if ( repositorioDeOperador == null )
            {
                throw new ArgumentNullException( "repositorioDeOperador" );
            }

            _repositorioDeOperador = repositorioDeOperador;
        }

        public void ValideCadastro( Operador operador )
        {
            if ( operador == null )
            {
                throw new ArgumentException( "operador" );
            }

            _objetoValidado = operador;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeNaoInformado();
            ValideSenhaNaoInformado();
            ValideOperadorJaCadastrado();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao( Operador operador )
        {
            if ( operador == null )
            {
                throw new ArgumentException( "operador" );
            }

            _objetoValidado = operador;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeNaoInformado();
            ValideSenhaNaoInformado();
            ValideOperadorNaoCadastrado();

            base.GarantaSucesso();
        }

        public void ValideExclusao( Operador operador )
        {
            if ( operador == null )
            {
                throw new ArgumentException( "operador" );
            }

            _objetoValidado = operador;
            base.LimpeInconsistencias();

            ValideOperadorNaoCadastrado();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if ( _objetoValidado.Codigo == 0 )
            {
                AdicioneInconsistencia( "Código não informado." );
            }
        }

        private void ValideNomeNaoInformado()
        {
            if ( String.IsNullOrWhiteSpace( _objetoValidado.Nome ) )
            {
                AdicioneInconsistencia( "Nome não informada." );
            }
        }

        private void ValideSenhaNaoInformado()
        {
            if ( String.IsNullOrWhiteSpace( _objetoValidado.Senha ) )
            {
                AdicioneInconsistencia( "Senha não informada." );
            }
        }

        private bool MarcaJaCadastrada()
        {
            return _repositorioDeOperador.Consulte( m => m.Codigo == _objetoValidado.Codigo ).Any();
        }

        private void ValideOperadorJaCadastrado()
        {
            if ( MarcaJaCadastrada() )
            {
                AdicioneInconsistencia( "Já existe um Operador cadastrada com o código {0}.", _objetoValidado.Codigo );
            }
        }

        private void ValideOperadorNaoCadastrado()
        {
            if ( !MarcaJaCadastrada() )
            {
                AdicioneInconsistencia( "Operador com o código {0} não cadastrada.", _objetoValidado.Codigo );
            }
        }
    }
}
